package org.liky.game.frame;
import java.awt.event.MouseEvent;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class FiveChessFrame extends JFrame implements MouseListener {

    int width = Toolkit.getDefaultToolkit().getScreenSize().width;  //取得屏幕的宽度
    int height = Toolkit.getDefaultToolkit().getScreenSize().height;  //取得屏幕的高度
    BufferedImage bgImage = null;                                     //背景图片
    int x = 0,y = 0;                                                  //保存棋子坐标
    int[][] allChess = new int[19][19];    //保存之前下过的全部棋子的坐标,其中数据内容0表示这个点没有棋子，1表示是黑子，2表示是白子
    boolean isBlack = true;                //标识当前是黑棋还是白棋在棋盘下一步
    boolean canPlay = true;                //表示当前游戏是否可以继续
    String message = "黑方先行"; //保存显示的提示信息


    public FiveChessFrame(){
        this.setTitle("五子棋");                                  //设置标题
        this.setSize(500,500);                      //设置窗体大小
        this.setLocation((width - 500)/2,(height - 500)/2); //设置窗体出现位置
        this.setResizable(false);                                  //设置窗体不可变
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     //将窗体的关闭方式设置为默认关闭后程序结束
        this.setVisible(true);                                    //将窗体显示出来
        this.addMouseListener(this);                            //为窗体加入监听器

        try {
            bgImage = ImageIO.read(new File("C:/Users/16399/Pictures/Screenshots/background1.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void paint(Graphics g){

        g.drawImage(bgImage,3,20,this);           //绘制背景
        g.setFont(new Font("黑体",Font.BOLD,20));     //输出标题信息
        g.drawString("游戏信息:" + message ,130,60);
        g.setFont(new Font("宋体",0,14));        //输出时间信息
        g.drawString("黑方时间：无限制",30,470);
        g.drawString("白方时间：无限制",260,470);

        //绘制棋盘
        for(int i=0; i<19; i++) {
            g.drawLine(13, 70+20*i, 377, 70+20*i);
            g.drawLine(13+20*i,70,13+20*i,437);
        }

        //标注点位
        g.fillOval(71,128,4,4);
        g.fillOval(310,128,4,4);
        g.fillOval(310,368,4,4);
        g.fillOval(71,368,4,4);
        g.fillOval(310,248,4,4);
        g.fillOval(190,128,4,4);
        g.fillOval(71,248,4,4);
        g.fillOval(190,368,4,4);
        g.fillOval(190,248,4,4);


        //绘制全部棋子
        for(int i=0; i<19; i++){
            for (int j=0; j<19; j++){
                if(allChess[i][j] == 1){
                    //黑子
                    int tempX = i*20+13;
                    int tempY = j*20+70;
                    g.fillOval(tempX-6,tempY-6,12,12);
                }
                if(allChess[i][j] == 2){
                    //白子
                    int tempX = i*20+13;
                    int tempY = j*20+70;
                    g.setColor(Color.RED);
                    g.fillOval(tempX-6,tempY-6,12,12);
                    g.setColor(Color.BLACK);
                    g.drawOval(tempX-6,tempY-6,12,12);
                }

            }
        }

    }


    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mousePressed(MouseEvent e) {
        if(canPlay == true) {
            x = e.getX();
            y = e.getY();
            if (x >= 13 && x <= 377 && y >= 70 && y <= 437) {
                x = (x - 13) / 20;
                y = (y - 70) / 20;
                if (allChess[x][y] == 0) {
                    //判断当前要下的是什么颜色的棋子
                    if (isBlack == true) {
                        allChess[x][y] = 1;
                        isBlack = false;
                        message = "轮到白方";
                    } else {
                        allChess[x][y] = 2;
                        isBlack = true;
                        message = "轮到黑方";
                    }

                    //判断这个棋子是否和其他的棋子连成5个，即判断游戏是否结束
                    boolean winFlag = this.checkWin();
                    if (winFlag == true) {
                        JOptionPane.showMessageDialog(this, "游戏结束,"
                                + (allChess[x][y] == 1 ? "黑方赢了！" : "白方赢了！"));
                        canPlay = false;
                    }

                } else {
                    JOptionPane.showMessageDialog(this, "当前位置已经有棋子，请重新落子！");
                }
                this.repaint();

            }
        }

        System.out.println(e.getX() +"--"+e.getY());
        //点击“开始游戏”按钮
        if(e.getX()>=410 && e.getX()<=478 && e.getY()>=70 && e.getY()<=97){
            int result = JOptionPane.showConfirmDialog(this,"是否重新开始游戏？");
            if(result==0){
                /**现在重新开始游戏
                 * 重新开始要做的操作：1.棋盘清空，allChess数组中的全部数据归零
                 *                 2.将 游戏信息 显示改为开始位置
                 *                 3.将下一步下棋的人改为黑方
                 */
                for(int i=0; i<19; i++){
                    for(int j=0;j<19; j++){
                        allChess[i][j]=0;
                    }
                }
                message="黑方先行";
                isBlack = true;
                this.repaint();
            }
        }

        //点击“游戏设置”按钮
        if(e.getX()>=410 && e.getX()<=478 && e.getY()>=123 && e.getY()<=148){
            JOptionPane.showMessageDialog(this,"抱歉，本游戏暂不支持设置");
        }

        //点击“游戏说明”按钮
        if(e.getX()>=410 && e.getX()<=478 && e.getY()>=173 && e.getY()<=200){
            JOptionPane.showMessageDialog(this,"这是一个五子棋游戏程序，" +
                                                                        "黑白双方轮流下棋，当某一方连到五子时游戏结束");
        }

        //点击“认输”按钮
        if(e.getX()>=410 && e.getX()<=478 && e.getY()>=273 && e.getY()<=305){
            int result = JOptionPane.showConfirmDialog(this,"是否确认认输？");
            if(result==0){
                if(isBlack){
                    JOptionPane.showMessageDialog(this,"黑方已经认输，游戏结束");
                }else{
                    JOptionPane.showMessageDialog(this,"白方已经认输，游戏结束");
                }
                canPlay = false;
            }
        }

        //点击“关于”按钮
        if(e.getX()>=410 && e.getX()<=478 && e.getY()>=325 && e.getY()<=355){
            JOptionPane.showMessageDialog(this,"本游戏由XX制作，有相关问题请咨询专业人员");
        }

        //点击“退出”按钮
        if(e.getX()>=410 && e.getX()<=478 && e.getY()>=376 && e.getY()<=406){
            JOptionPane.showMessageDialog(this,"游戏结束");
            System.exit(0);
        }

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    private boolean checkWin(){
        boolean flag = false;
        int count = 1;        //count保存共有多少相同颜色棋子相连

        int color = allChess[x][y];

        //通过循环来做棋子相连的判断

        //横向判断
        int i =1;
        while(color == allChess[x+i][y]){
            count++;
            i++;
        }
        i=1;
        while(color == allChess[x-i][y]){
            count++;
            i++;
        }
        if(count>=5){
            flag = true;
        }


        //纵向判断
        int i2 = 1;
        int count2 =1;
        while(color == allChess[x][y+i2]){
            count2++;
            i2++;
        }
        i2=1;
        while(color == allChess[x][y-i2]){
            count2++;
            i2++;
        }
        if(count2>=5){
            flag = true;
        }


        //斜方向判断（右上 + 左下）
        int i3 = 1;
        int count3 =1;
        while(color == allChess[x+i3][y-i3]){
            count3++;
            i3++;
        }
        i3=1;
        while(color == allChess[x-i3][y+i3]){
            count3++;
            i3++;
        }
        if(count3>=5){
            flag = true;
        }


        //斜方向判断（右下 + 左上）
        int i4 = 1;
        int count4 =1;
        while(color == allChess[x+i4][y-i4]){
            count4++;
            i4++;
        }
        i4=1;
        while(color == allChess[x-i4][y+i4]){
            count4++;
            i4++;
        }
        if(count4>=5){
            flag = true;
        }


        return flag;
    }


    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}
